package com.zhongzhi.serviceimpl;


import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.zhongzhi.common.Common;
import com.zhongzhi.common.Plc;
import com.zhongzhi.common.Primary;
import com.zhongzhi.dao.MeasureDao;
import com.zhongzhi.dao.StationDao;
import com.zhongzhi.dao.TypeDao;
import com.zhongzhi.springboot.pojo.EquipmentShow;
import com.zhongzhi.springboot.pojo.MeasureShow;
import com.zhongzhi.springboot.pojo.StationShow;
import com.zhongzhi.springboot.pojo.Type;
import com.zhongzhi.thread.TaskTherad;
import com.zhongzhi.util.Bo;

import lombok.extern.log4j.Log4j;

@Log4j
@Service
public class PortService {
	@Autowired
	private StationDao stationDao;
	@Autowired
	private TypeDao typeDao;
	@Autowired
	private MeasureDao measureDao;
	/**
	 * 
	 * @param kmatn		机种
	 * @param hogi		机号
	 * @param station	测试工位
	 * @param size		检测条数
	 * @return
	 * 
	 * 根据参数将测量线程中的启动打开
	 * 
	 * 首先进行参数校验
	 * 参数合格后首先进行工位查询,如果工位不合格,返回错误信息
	 * 其次检测是否有此机型,如果没有,则创建该机型
	 * 根据机型名称查询该机型,如果有多个,则默认取第一个
	 * 从公共对象中获取线程对象,根据工位id找到它的测量线程
	 * 设置测量线程的参数,设置测量线程运行
	 */
	public Bo startdetection(String kmatn,String hogi,String station,String size,Double upa,Double upb,Double downa,Double downb) {
		log.info("后端业务层:接口:启动测量:+kmatn="+kmatn+",hogi="+hogi+",station="+station+",size="+size);
		try {
			if (kmatn==null || kmatn.equals("")) {
				return new Bo(false, 400, "机种名称不能为空", 0, null);
			}else if (hogi==null || hogi.equals("")) {
				return new Bo(false, 400, "机号名称不能为空", 0, null);
			}else if (station==null || station.equals("")) {
				return new Bo(false, 400, "工位不能为空", 0, null);
			}else {
				if(upa==null || upa==0.0) {
					upa = 0.0;
				}
				if(upb==null || upb==0.0) {
					upb = 0.0;
				}
				if(downa==null || downa==0.0) {
					downa = 0.0;
				}
				if(downb==null || downb==0.0) {
					downb = 0.0;
				}
				
				
				
				int stationSize = stationDao.selectByStation(station);
				if (stationSize==0) {
					return new Bo(false, 400, "无此工位", 0, null);
				}
				//查询此种号的机型
				List<Type> typeSize = typeDao.selectByName(kmatn);
				log.info("后端业务层:接口:启动测量:根据机型名查询机型集合结果:"+typeSize);
				List<StationShow> t = null;
				//如果没有此种机型,则创建此种机型
				if (typeSize==null || typeSize.size()==0) {
					Type type = new Type();
					type.setTypeName(kmatn);
					type.setRemarks("此机型在测试过程中自动创建");
					int insert = typeDao.insert(type);
					log.info("后端业务层:接口:启动测量:无该机型信息,自动创建结果:"+insert);
					if (insert==0) {
						return new Bo(false, 500, "无法登录此种机型", 0, null);
					}
				}
				//查询此种机型的信息
				t = stationDao.selectByStationName(station);
				log.info("后端业务层:接口:启动测量:查询工位信息集合:"+t);
				//公共对象获取监控线程,设置监控线程运行 
				
				Integer id = t.get(0).getId();
				HashMap<Integer, TaskTherad> taskTherads = Common.getTaskTherads();
				//查询此工位是否属于本台电脑
				Set<Integer> keySet = taskTherads.keySet();
				boolean contains = keySet.contains(id);
				if (contains==false) {
					return new Bo(false, 400, "此工位不属于本台电脑管理", 0, null);
				}else {
					Integer equipmentId = t.get(0).getEquipmentId();
					Plc plc = Primary.getMap().get(equipmentId);
//					if (plc.getPlcState()==false) {
//						return new Bo(false, 202, "管理该工位的plc无法连接", 0, null);
//					}else {
						TaskTherad taskTherad = Common.getTaskTherads().get(id);
						
						
						if (taskTherad.getRun()==true) {
							return new Bo(false, 201, "该工位正在运行,请检查工位信息", 0, null);	
						}else {
							taskTherad.setRun(true);
							taskTherad.setStationid(id);
							taskTherad.setType(kmatn);
							taskTherad.setNum(hogi);
							
							taskTherad.setUpa(upa);
							taskTherad.setUpb(upb);
							taskTherad.setDowna(downa);
							taskTherad.setDownb(downb);
							
							return new Bo(true, 200, "程序已经开始", 0, null);
						}
//					}
				}
			}
		} catch (Exception e) {
			log.error("后端业务层:接口:启动测量错误:"+e);
			return new Bo(false, 500, "程序错误", 0, e);
		}
		
	}
	/**
	 * 
	 * @param totalsize		检测条数
	 * @param kmatn			机种
	 * @param hogi			机号
	 * @return
	 * 
	 * 首先进行参数校验
	 * 如果参数全部合格,则查询公共对象中的线程变量
	 * 通过拿到线程集合中的key,来遍历线程集合
	 * 比较线程集合中有没有当前机号,并且当前机号处于运行状态
	 * 如果符合,返回当前机器运行的状态
	 * 如果以上条件不满足,则查询数据库里的内容,把数据库的数据返回
	 */
	public Bo querydetectionList(String totalsize,String kmatn,String hogi) {
		log.info("后端业务层:接口:获取检测结果:totalsize="+totalsize+"kmatn="+kmatn+"hogi="+hogi);
		try {
			if (kmatn==null || kmatn.equals("")) {
				return new Bo(false, 400, "机种名称不能为空", 0, null);
			}else if (hogi==null || hogi.equals("")) {
				return new Bo(false, 400, "机号名称不能为空", 0, null);
			}else {
				//首先查询线程有没有运行
				HashMap<Integer, TaskTherad> taskTherads = Common.getTaskTherads();
				Set<Integer> keySet = taskTherads.keySet();
				for (Integer integer : keySet) {
					TaskTherad taskTherad = taskTherads.get(integer);
					if ((taskTherad.getNum()!=null) && taskTherad.getType()!=null) {
						if (hogi.equals(taskTherad.getNum()) && kmatn.equals(taskTherad.getType())) {
							if (taskTherad.getRun()) {
								return new Bo(false,201, "当前机器正在测试", 0, null);
							}
						}
					}
				}
				//查询机型id
				List<Type> t = typeDao.selectByName(kmatn);
				log.info("后端业务层:接口:获取检测结果:查询机型信息:"+t);
				//查询结果
				List<MeasureShow> selectByNum = measureDao.selectByNum(t.get(0).getId(),hogi);
				log.info("后端业务层:接口:获取检测结果:查询结果信息:"+selectByNum);
				if (selectByNum==null || selectByNum.size()==0) {
					return new Bo(false,410, "查询失败,没有该机型信息", 1,null);
				}else {
					return new Bo(true,200, "查询成功", 1, selectByNum);
				}
			}
		} catch (Exception e) {
			log.error("后端业务层:接口:获取检测结果错误:"+e);
			return new Bo(false, 500, "程序错误", 0, e);
		}
		
	}
	/**
	 * 
	 * @param station
	 * @return
	 * 根据工位编号停止工位运行的检测
	 * 首先获取公共资源的测量线程集合
	 * 根据工位名字查询工位信息集合(由于工位名可能存在重复,可能是个集合)
	 * 根据工位id获取测量线程
	 * 检查测量线程的运行状态是否为true
	 * 	如果为true,则设置停止为true,并返回结果
	 * 	如果为false,则返回运行完毕的结果
	 * 
	 */
	public Bo enddetection(String station) {
		log.info("后端业务层:接口:停止检测:"+station);
		try {
			if (station==null || station.equals("")) {
				return new Bo(false, 400, "工位不能为空", 0, null);
			}else {
				
				HashMap<Integer, TaskTherad> taskTherads = Common.getTaskTherads();
				List<StationShow> select = stationDao.selectByStationName(station);
				log.info("后端业务层:接口:停止检测:查询机种信息结果:"+select);
				if (select!=null && select.size()!=0) {
					StationShow stationShow = select.get(0);
					Set<Integer> keySet = taskTherads.keySet();
					boolean contains = keySet.contains(stationShow.getId());
					if (contains) {
						TaskTherad taskTherad = taskTherads.get(stationShow.getId());
						if (taskTherad.getRun()) {
							taskTherad.setStop(true);
							return new Bo(true, 200, "工位已经停止", 0, null);
						}else {
							return new Bo(false, 201, "工位已经运行完毕", 0, null);
						}
					}
				}
				return new Bo(false, 400, "该工位不属于本计算机", 0, null);
				
			}
		} catch (Exception e) {
			log.error("后端业务层:接口:停止检测错误:"+e);
			return new Bo(false, 500, "程序错误", 0, e);
		}
		
		
	}
}
